<?php

/**
* @desc Block menu navigation. 
* 
*/
class Kernel_Block_Navigation extends Kernel_Block
{
    
    /**
    * @desc Name of the default class. 
    * 
    */
    const DEFAULT_CLASS = 'home';
    
    /**
     * @desc Menu name. 
     *
     * @param string
     */
    public $menu;
    
    /**
     * @desc Default menu navigation. 
     *
     * @param integer
     */
    static protected $_default; 
    
    /**
    * @desc Menu cach. 
    * 
    * @param array
    */
    static protected $_menu = array();

    /**
     * @desc Return template data. 
     *
     * @return  array
     */
    public function getData()
    {
        // define menu name
        if (is_null($this->menu)) { $this->menu = self::_default(); }
        
        // search in cach
        if (!array_key_exists($this->menu, self::$_menu)) {
            $this->_menu();
        }
        
        return array('menu' => self::$_menu[$this->menu]);
    }
    
    /**
    * @desc Transform entries and store in cach. 
    * 
    */
    protected function _menu() 
    {
        $entries = Kernel::factory('Kernel', 'Resource')
            ->menu($this->menu, Kernel_Filter_Structure::getMenuId());
        
        foreach ($entries as &$entry) {
            $entry['class'] = $this->_getClass($entry['url']);
        }
        
        self::$_menu[$this->menu] = Kernel_Util_Tree::convert($entries);
    }
    
    /**
     * Возвращает наименование класса элемента меню. Фактически, с т.з.
     * семантики это его идентификатор, просто поле 'id' уже забито для
     * построения дерева.
     *
     * @param   string  $url
     * @return  string
     */
    protected function _getClass($url)
    {
        return preg_match('|([^/]+)/?$|', $url, $matches) ? $matches[1] : self::DEFAULT_CLASS;
    }
    
    /**
     * @desc Return default menu name. 
     *
     * @return  string
     */
    static protected function _default()
    {
        if (is_null(self::$_default))
        {
            $query = '
                SELECT 
                       `name`
                  FROM 
                       `system_navigation`
              ORDER BY
                       `id`
                 LIMIT 
                       1
                ';
            self::$_default = database::fetchOne($query);
        }

        return self::$_default;
    }
    
}
